package controller

import (
	"fmt"
	"log"
	"net/http"
	"tt_erp/common"
	"tt_erp/dto"
	"tt_erp/model"
	"tt_erp/response"
	"tt_erp/utils"

	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
	uuid "github.com/satori/go.uuid"
	"golang.org/x/crypto/bcrypt"
)

// 用户注册
func Register(c *gin.Context) {
	DB := common.InitDB()
	// 获取参数
	var user model.User
	err := c.ShouldBindJSON(&user)
	if err != nil {
		// 将错误对象转换为字符串
		errStr := errors.Wrap(err, "绑定JSON数据出错").Error()
		response.Response(c, http.StatusBadRequest, 422, gin.H{"error": errStr}, "获取参数错误")
		return
	}
	username := user.Username
	password := user.Password
	telephone := user.Telephone
	nickname := user.Nickname
	email := user.Email
	role := user.Role

	// 数据验证
	if len(telephone) != 11 || !utils.VerifyMobileFormat(telephone) {
		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "请输入正确的手机号")
		return
	}

	// 如果昵称没有传,给一个10位随机字符串
	if len(nickname) == 0 {
		nickname = "tt_" + utils.RandomString(10)
	}
	// 判断手机号是否存在
	if utils.IsTelephoneExist(DB, telephone) {
		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "手机号已存在")
		return
	}
	// 判断用户名是否存在
	if utils.IsUserExist(DB, username) {
		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "用户名已存在")
		return
	}
	// 加密
	hasedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	// 创建用户
	if err != nil {
		response.Response(c, http.StatusUnprocessableEntity, 500, nil, "加密错误")
		return
	}
	newUser := model.User{
		UUID:      uuid.NewV4(),
		Username:  username,
		Telephone: telephone,
		Password:  string(hasedPassword),
		Nickname:  nickname,
		Email:     email,
		Role:      role,
	}
	d := DB.Create(&newUser)
	fmt.Println(d)

	// 返回结果
	response.Success(c, nil, "注册成功")
}

// 用户名登录
func Login(c *gin.Context) {
	DB := common.InitDB()
	// 获取参数
	var user model.User
	err := c.ShouldBindJSON(&user)
	if err != nil {
		// 将错误对象转换为字符串
		errStr := errors.Wrap(err, "绑定JSON数据出错").Error()
		response.Response(c, http.StatusBadRequest, 422, gin.H{"error": errStr}, "获取参数错误")
		return
	}
	username := user.Username
	password := user.Password

	// 判断用户是否存在
	DB.Where("username=?", username).First(&user)
	if user.ID == 0 {
		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "用户不存在")
		return
	}
	// 判断密码是否正确
	if !utils.CryptographicCheck(user, password) {
		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "密码错误")
		return
	}
	// 发送token
	token, err := common.GenerateToken(user)
	if err != nil {
		response.Response(c, http.StatusUnprocessableEntity, 500, nil, "系统异常")
		log.Printf("token generate error:%v", err)
		return
	}
	// 返回结果
	response.Success(c, gin.H{"token": token}, "登录成功")
}

// 手机登录
// func Login(c *gin.Context) {
// 	DB := common.InitDB()
// 	// 获取参数
// 	telephone := c.PostForm("telephone")
// 	password := c.PostForm("password")
// 	// 数据验证
// 	if len(password) < 8 {
// 		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "密码不能少于8位")
// 		return
// 	}
// 	// 判断手机号是否存在
// 	var user model.User
// 	DB.Where("telephone=?", telephone).First(&user)
// 	if user.ID == 0 {
// 		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "用户不存在")
// 		return
// 	}
// 	// 判断密码是否正确
// 	if !utils.CryptographicCheck(user, password) {
// 		response.Response(c, http.StatusUnprocessableEntity, 422, nil, "密码错误")
// 		return
// 	}
// 	// 发送token
// 	token, err := common.GenerateToken(user)
// 	if err != nil {
// 		response.Response(c, http.StatusUnprocessableEntity, 500, nil, "系统异常")
// 		log.Printf("token generate error:%v", err)
// 		return
// 	}
// 	// 返回结果
// 	response.Success(c, gin.H{"token": token}, "登录成功")
// }

// 用户信息
func Info(c *gin.Context) {
	userInfo, _ := c.Get("user")
	c.JSON(http.StatusOK, gin.H{"code": 200, "data": gin.H{"userInfo": dto.ToUserDto(userInfo.(model.User))}})
}
